package fr.bugtracker.bean.administration.utilisateur;

import java.util.ArrayList;
import java.util.List;

import javax.ejb.EJB;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;

import fr.bugtracker.bean.AbstractBean;
import fr.bugtracker.commun.datamodel.UtilisateurDataModel;
import fr.bugtracker.commun.exception.ExceptionFonctionnelle;
import fr.bugtracker.commun.outils.UtilsJsf;
import fr.bugtracker.commun.outils.UtilsLogger;
import fr.bugtracker.entity.technique.Profil;
import fr.bugtracker.entity.technique.Utilisateur;
import fr.bugtracker.service.administration.utilisateur.SrvGererUtilisateur;

/**
 * Bean pour la gestion des listeUtilisateur
 * @author lparrot
 */
@ManagedBean
@ViewScoped
public class BeanGererUtilisateur extends AbstractBean {

	/**
	 * fr.bugtracker.service ejb pour gérer les listeUtilisateur
	 */
	@EJB
	private SrvGererUtilisateur srvGererUtilisateur;
	/**
	 * la liste de tous les listeUtilisateur de l'application
	 */
	private UtilisateurDataModel listeUtilisateur;
	/**
	 * la liste des listeRole pour l'affichage dans la liste déroulante
	 */
	private List<Profil> listeProfil = new ArrayList<Profil>();
	/**
	 * l'utilisateur selectionné
	 */
	private Utilisateur utilisateur;
	/**
	 * type de recherche
	 */
	private boolean typeRecherche = true;

	/**
	 * Constructeur de la classe <code>BeanGererUtilisateur</code>.
	 */
	public BeanGererUtilisateur() {
	}

	/**
	 * Méthode d'initialisation du fr.bugtracker.bean
	 */
	@Override
	public void initialisation() {
		rechercherUtilisateurs();
		listeProfil = srvGererUtilisateur.getAllProfil();
	}

	/**
	 * Recherche les utilisateurs
	 */
	public void rechercherUtilisateurs() {
		listeUtilisateur = new UtilisateurDataModel(typeRecherche);
	}

	/**
	 * Affiche le dialog utilisateur
	 * @param utilisateur {@link Utilisateur}
	 */
	public void affichageDialogUtilisateur(Utilisateur utilisateur) {
		this.utilisateur = utilisateur;
		UtilsJsf.executeUpdate("frm-dialog-utilisateur");
		if (!FacesContext.getCurrentInstance().isValidationFailed()) {
			UtilsJsf.executeJavascript("dialogUtilisateur.show()");
		}
	}

	/**
	 * Permet de modification l'utilisateur
	 */
	public void modifierUtilisateur() {
		try {
			UtilsLogger.debug("utilisateur : " + utilisateur);
			srvGererUtilisateur.modifierUtilisateur(utilisateur);
			UtilsJsf.addMessage(FacesMessage.SEVERITY_INFO, "fonctionnel.utilisateur.info.modification", utilisateur.getUsername());
			rechercherUtilisateurs();
			utilisateur = null;
			UtilsJsf.executeJavascript("dialogUtilisateur.hide()");
			UtilsJsf.executeUpdate("form-tableau-utilisateur:tableau-utilisateur", "panel-utilisateur");
		} catch (ExceptionFonctionnelle e) {
			UtilsJsf.addMessage(FacesMessage.SEVERITY_ERROR, e.getMessage(), e.getProperties());
		}
	}

	/**
	 * Supprime l'utilisateur en parametre
	 * @param u {@link Utilisateur}
	 */
	public void supprimerUtilisateur(Utilisateur u) {
		srvGererUtilisateur.supprimerUtilisateur(u);
		rechercherUtilisateurs();
		UtilsJsf.executeUpdate("form-tableau-utilisateur:tableau-utilisateur");
		UtilsJsf.addMessage(FacesMessage.SEVERITY_INFO, "fonctionnel.utilisateur.info.suppression", u.getUsername());
	}

	/**
	 * Réactive le compte de l'utilisateur en paramètre
	 * @param u {@link Utilisateur}
	 */
	public void ractiverCompte(Utilisateur u) {
		srvGererUtilisateur.ractiverCompte(u);
		rechercherUtilisateurs();
		UtilsJsf.executeUpdate("form-tableau-utilisateur:tableau-utilisateur");
		UtilsJsf.addMessage(FacesMessage.SEVERITY_INFO, "fonctionnel.utilisateur.info.reactivation", u.getUsername());
	}

	/**
	 * <p><b>Accès en lecture à l'attribut listeUtilisateur.</b></p>
	 * @return Retourne l'attribut listeUtilisateur sous forme de <code>UtilisateurDataModel</code>.
	 */
	public UtilisateurDataModel getListeUtilisateur() {
		return this.listeUtilisateur;
	}

	/**
	 * <p><b>Accès en écriture à l'attribut listeUtilisateur.</b></p>
	 * @param listeUtilisateur L'attribut listeUtilisateur à modifier.
	 */
	public void setListeUtilisateur(UtilisateurDataModel listeUtilisateur) {
		this.listeUtilisateur = listeUtilisateur;
	}

	/**
	 * <p><b>Accès en lecture à l'attribut listeProfil.</b></p>
	 * @return Retourne l'attribut listeProfil sous forme de <code>List<Profil></code>.
	 */
	public List<Profil> getListeProfil() {
		return this.listeProfil;
	}

	/**
	 * <p><b>Accès en écriture à l'attribut listeProfil.</b></p>
	 * @param listeProfil L'attribut listeProfil à modifier.
	 */
	public void setListeProfil(List<Profil> listeProfil) {
		this.listeProfil = listeProfil;
	}

	/**
	 * <p><b>Accès en lecture à l'attribut utilisateur.</b></p>
	 * @return Retourne l'attribut utilisateur sous forme de <code>Utilisateur</code>.
	 */
	public Utilisateur getUtilisateur() {
		return this.utilisateur;
	}

	/**
	 * <p><b>Accès en écriture à l'attribut utilisateur.</b></p>
	 * @param utilisateur L'attribut utilisateur à modifier.
	 */
	public void setUtilisateur(Utilisateur utilisateur) {
		this.utilisateur = utilisateur;
	}

	/**
	 * <p><b>Accès en lecture à l'attribut typeRecherche.</b></p>
	 * @return Retourne l'attribut typeRecherche sous forme de <code>boolean</code>.
	 */
	public boolean isTypeRecherche() {
		return this.typeRecherche;
	}

	/**
	 * <p><b>Accès en écriture à l'attribut typeRecherche.</b></p>
	 * @param typeRecherche L'attribut typeRecherche à modifier.
	 */
	public void setTypeRecherche(boolean typeRecherche) {
		this.typeRecherche = typeRecherche;
	}

}
